package Q16_18_Pattern_Matcher; public class QuestionB { public static String formStringFromPattern(String pattern, String first, String second) { if (pattern.length() == 0) return null; StringBuffer sb = new StringBuffer(); char firstChar = pattern.charAt(0); for (char c : pattern.toCharArray()) { if (c == firstChar) { sb.append(first); } else if (c != firstChar) { sb.append(second); } else { return null; } } return sb.toString(); } public static int countOf(String pattern, char ch) { int count = 0; for (char c : pattern.toCharArray()) { if (c == ch) { count++; } } return count; } public static String canonical(String pattern) { if (pattern.charAt(0) == 'a') return pattern; StringBuffer sb = new StringBuffer(); for (char c : pattern.toCharArray()) { if (c == 'a') { sb.append('b'); } else { sb.append('a'); } } return sb.toString(); } public static boolean doesMatch(String pattern, String value) { if (pattern.length() == 0) return value.length() == 0; pattern = canonical(pattern); int countOfAs = countOf(pattern, 'a'); int countOfBs = pattern.length() - countOfAs; int firstB = pattern.indexOf('b'); for (int aSize = 0; aSize <= value.length() / countOfAs; aSize++) { int remainingLength = value.length() - aSize * countOfAs; String first = value.substring(0, aSize); if (countOfBs == 0 || remainingLength % countOfBs == 0) { int bIndex = firstB * aSize; int bSize = countOfBs == 0 ? 0 : remainingLength / countOfBs; String second = countOfBs == 0 ? "" : value.substring(bIndex, bSize + bIndex); String candidate = formStringFromPattern(pattern, first, second); if (candidate.equals(value)) { System.out.println(first + ", " + second); return true; } } } return false; } public static void main(String[] args) { String[][] tests = {{"ababb", "backbatbackbatbat"}, {"abab", "backsbatbackbats"}, {"aba", "backsbatbacksbat"}}; for (String[] test : tests) { String pattern = test[0]; String value = test[1]; System.out.println(pattern + ", " + value + ": " + doesMatch(pattern, value)); } } }